package com.mexcad.reports;

import java.awt.Color;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;
import com.mexcad.db.connectors.CreditoConnector;
import com.mexcad.db.connectors.ReportConnectors;
import com.mexcad.db.dto.CargoPago;
import com.mexcad.db.dto.Credito;
import com.mexcad.reports.utils.DataType;
import com.mexcad.reports.utils.DocumentsAdds;
import com.mexcad.reports.utils.PDFDocumentException;
import com.mexcad.reports.utils.PDFTable;
import com.mexcad.utils.Formatter;

public class ComisionistasReport extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private PdfWriter writer; 
	private String titulo="Comisiones";


	protected void doPost(HttpServletRequest req, HttpServletResponse res)
	throws ServletException, IOException {
	
		try {
			Document doc =  new Document(PageSize._11X17.rotate(), 25, 25, 25, 50);
			writer=   PdfWriter.getInstance(doc, res.getOutputStream());
			writer.setViewerPreferences(PdfWriter.PageModeUseThumbs);
			writer.setLinearPageMode();
			writer.setPageEvent( new DocumentsAdds.MyPageEvents());
			
			DocumentsAdds.addMetaData(doc, "Documento Test");
			doc.open();
			
			String fechaIni= req.getParameter("fecha_ini");
			String fechaFin= req.getParameter("fecha_fin");
			PDFTable pdfTable=null;
			
			if(fechaIni != null && fechaFin!= null){
				DocumentsAdds.addSimpleHeader(doc, titulo, fechaIni, fechaFin);
				
	//			List<Credito> list = ReportConnectors.getAllCreditosByPeriodoAndEsquemaCredito(fechaIni, fechaFin,
	//												  especial,unam, normaliva,normal,especialFinal, entregasParciales, unamIva  );
				Map<Integer,String> mapClientes = ReportConnectors.getAllClientes();
					
				if( mapClientes!=null){
					List<Object []> lista =  ReportConnectors.getAllCargosCreditosDeCargoPagoByPeriodo(fechaIni,fechaFin);
					String []header =new String[]{"Num. Crédito", "Nombre del cliente","Fecha de registro", "Cargo total",
		  					 "Interés","Impuesto"};
					float []tamCols =new float[]{1,2.5f ,1.5f,1.5f, 1.5f, 1.5f };
					List<DataType []> listadoDatos = new ArrayList<DataType []>();
	
					
					for(Iterator<Object []> it = lista.iterator();it.hasNext();){
						Object [] cp = (Object [])it.next();
						Credito cred= CreditoConnector.getCreditoPorId((Integer)cp[1]);
						
						List<CargoPago> listadoPagos= ReportConnectors.consultaCargosParaRentaCredito((Integer)cp[0],(Integer)cp[1],fechaIni,fechaFin);
						
						for(int i=0;i<listadoPagos.size();++i){
							DataType []datos = new DataType[header.length];
							CargoPago cargoPago = listadoPagos.get(i);
							
							 datos[0]= new DataType();
							 datos[0].setAlignMode(Element.ALIGN_CENTER);
							 datos[0].setData(cargoPago.getCkCargoPago().getIdCredito());
							 datos[0].setDataType(DataType.STRING_TYPE);
	
							 datos[1]= new DataType();
							 datos[1].setAlignMode(Element.ALIGN_LEFT);
							 datos[1].setData(mapClientes.get(cred.getCkCredito().getIdCliente()));
							 datos[1].setDataType(DataType.STRING_TYPE);
	
							 datos[2]= new DataType();
							 datos[2].setAlignMode(Element.ALIGN_CENTER);
							 datos[2].setData(Formatter.getStringFromDate(cargoPago.getFechaRegistro()));
							 datos[2].setDataType(DataType.STRING_TYPE);
	
						
							 double cargo = cargoPago.getAbono();
							 double impuesto = cargo/(1+CreditoConnector.IVA);
							 datos[3]= new DataType();
							 datos[3].setAlignMode(Element.ALIGN_RIGHT);
							 datos[3].setData(cargo);
							 datos[3].setDataType(DataType.CURRENCY_TYPE);
	
							 datos[4]= new DataType();
							 datos[4].setAlignMode(Element.ALIGN_RIGHT);
							 
							 datos[4].setData(impuesto);
							 datos[4].setDataType(DataType.CURRENCY_TYPE);
	
							 datos[5]= new DataType();
							 datos[5].setAlignMode(Element.ALIGN_RIGHT);
							 datos[5].setData(impuesto*CreditoConnector.IVA);
							 datos[5].setDataType(DataType.CURRENCY_TYPE);
							
							 listadoDatos.add(datos);
						}
						
					}
					
					pdfTable = new PDFTable(tamCols,header,listadoDatos);
					doc.add(pdfTable.getTable());
				}
				
				
				
			}else{
				Paragraph p = new Paragraph("Error al generar el documento",FontFactory.getFont(FontFactory.COURIER, 28, Font.BOLD, new Color(0, 0, 0)));
				doc.add(p);
			}
			
			doc.add (Chunk.NEWLINE);
			doc.add (Chunk.NEWLINE);
			doc.close();
			
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (PDFDocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1)
			throws ServletException, IOException {
		doPost(arg0, arg1);
	}


}
